from datetime import datetime
from typing import Dict, Any
import json

class DeviceManager:
    def __init__(self):
        # 初始化设备状态字典，包含空调、除湿机和阀门的初始状态参数
        self.device_states = {
            'ac': {
                'running': False,        # 空调是否运行
                'temperature': 24,      # 空调目标温度
                'mode': '制冷'           # 空调模式（制冷/制热）
            },
            'dehumidifier': {
                'running': False,       # 除湿机是否运行
                'target': 50,          # 除湿机目标湿度
                'mode': '自动'           # 除湿机模式（除湿/加湿/自动）
            },
            'valve': {
                'running': False,       # 阀门是否开启
                'opening': 0,          # 阀门开度百分比
                'flow': 0              # 阀门流量
            }
        }
        
        # 设备控制规则字典，传感器类型与对应处理方法的映射
        self.control_rules = {
            'temperature': self._handle_temperature,   # 温度传感器处理函数
            'humidity': self._handle_humidity,        # 湿度传感器处理函数
            'water_level': self._handle_water_level    # 水位传感器处理函数
        }
    
    def process(self, msg: any) -> Dict[str, Any]:
        """根据传感器数据更新设备状态"""
        data = json.loads(msg.data())
        for sensor_type, value in data['values'].items():
            if sensor_type in self.control_rules:
                self.control_rules[sensor_type](value)
        return {
            'timestamp': data['timestamp'],
            'device_states': self.device_states
        }
    
    def get_device_states(self) -> Dict[str, Any]:
        """
        获取所有设备的当前状态。
        :return: 包含所有设备状态的字典
        """
        return self.device_states
    
    def _handle_temperature(self, value: float) -> None:
        """
        处理温度数据，根据温度自动控制空调。
        温度高于26度时，空调制冷并设定温度为当前温度-2（不超过26）；
        温度低于20度时，空调制热并设定温度为当前温度+2（不低于20）；
        其余情况关闭空调。
        :param value: 当前温度
        """
        ac = self.device_states['ac']
        if value > 26:
            ac['running'] = True
            ac['mode'] = '制冷'
            ac['temperature'] = min(value - 2, 26)
        elif value < 20:
            ac['running'] = True
            ac['mode'] = '制热'
            ac['temperature'] = max(value + 2, 20)
        else:
            ac['running'] = False
    
    def _handle_humidity(self, value: float) -> None:
        """
        处理湿度数据，根据湿度自动控制除湿机。
        湿度高于65时，除湿机除湿并降低目标湿度；
        湿度低于40时，除湿机加湿并提高目标湿度；
        其余情况除湿机自动模式并关闭。
        :param value: 当前湿度
        """
        dehumidifier = self.device_states['dehumidifier']
        if value > 65:
            dehumidifier['running'] = True
            dehumidifier['target'] = max(value - 10, 50)
            dehumidifier['mode'] = '除湿'
        elif value < 40:
            dehumidifier['running'] = True
            dehumidifier['target'] = min(value + 10, 60)
            dehumidifier['mode'] = '加湿'
        else:
            dehumidifier['running'] = False
            dehumidifier['mode'] = '自动'
    
    def _handle_water_level(self, value: float) -> None:
        """
        处理水位数据，根据水位自动控制阀门。
        水位高于80时，阀门全开并设定最大流量；
        水位低于20时，阀门关闭；
        水位在50-80之间时，阀门半开并设定中等流量。
        :param value: 当前水位
        """
        valve = self.device_states['valve']
        if value > 80:
            valve['running'] = True
            valve['opening'] = 100
            valve['flow'] = 2.0
        elif value < 20:
            valve['running'] = False
            valve['opening'] = 0
            valve['flow'] = 0
        else:
            valve['running'] = value > 50
            valve['opening'] = 50 if value > 50 else 0
            valve['flow'] = 1.0 if value > 50 else 0